package com.ssy.lingxi.product.service.material;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.product.model.dto.material.MaterialProcessDTO;
import com.ssy.lingxi.product.model.request.material.*;
import com.ssy.lingxi.product.model.resp.material.MaterialProcessDetailVO;
import com.ssy.lingxi.product.model.resp.material.MaterialProcessPageQueryVO;
import com.ssy.lingxi.product.model.resp.material.MaterialProcessRelMaterialGroupQueryVO;
import com.ssy.lingxi.product.model.resp.material.MaterialProcessRelMaterialQueryVO;
import com.ssy.lingxi.product.model.resp.platform.PlatformBaseMaterialProcessVO;

import java.util.List;

/**
 * 物料流程配置 服务接口
 * @author 彭冬冬
 * @version 2.0.0
 * @date 2022/3/25 14:13
 */
public interface IMaterialProcessService {
    /**
     * 分页查询物料流程规则
     * @param sysUser 登录用户
     * @param pageVO  分页查询条件
     * @return 查询结果
     */
    Wrapper<PageData<MaterialProcessPageQueryVO>> pageMaterialProcesses(UserLoginCacheDTO sysUser, MaterialProcessPageVO pageVO);

    /**
     * 新增物料流程规则页面 - 查询基础物料流程列表
     * @param sysUser 登录用户
     * @return 查询基础物料流程列表
     */
    Wrapper<List<PlatformBaseMaterialProcessVO>> listBaseMaterialProcesses(UserLoginCacheDTO sysUser);

    /**
     * 物料流程规则新增那种
     * @param sysUser 登录用户
     * @param saveVO 物料流程规则
     * @return 新增结果
     */
    Wrapper<Void> save(UserLoginCacheDTO sysUser, MaterialProcessVO saveVO);

    /**
     * 查询物料流程规则详情
     * @param sysUser 登录用户
     * @param processId 流程id
     * @return 查询结果
     */
    Wrapper<MaterialProcessDetailVO> getInfo(UserLoginCacheDTO sysUser, Long processId);

    /**
     * 查询物料组勾选树结构
     * @param sysUser 登录用户
     * @param processId 物料流程id
     * @return 查询结果
     */
    Wrapper<List<MaterialProcessRelMaterialGroupQueryVO>> treeRelMaterialGroup(UserLoginCacheDTO sysUser, Long processId);

    /**
     * 分页查询部分物料
     * @param sysUser 登录用户
     * @param pageVO 分页查询请求
     * @return 查询结果
     */
    Wrapper<List<MaterialProcessRelMaterialQueryVO>> listRelMaterial(UserLoginCacheDTO sysUser, MaterialProcessRelMaterialPageVO pageVO);

    /**
     * 修改物料流程规则
     * @param sysUser 登录用户
     * @param updateVO 修改数据
     * @return 修改结果
     */
    Wrapper<Void> update(UserLoginCacheDTO sysUser, MaterialProcessUpdateVO updateVO);

    /**
     * 修改物料流程状态
     * @param sysUser 登录用户
     * @param updateStatusVO 修改物料状态
     * @return 修改结果
     */
    Wrapper<Void> updateStatus(UserLoginCacheDTO sysUser, MaterialProcessUpdateStatusVO updateStatusVO);

    /**
     * 删除物料流程规则
     * @param sysUser 登录用户
     * @param processId 要删除的物料流程规则id
     * @return 删除结果
     */
    Wrapper<Void> delete(UserLoginCacheDTO sysUser, Long processId);

    /**
     * 查询物料是否配置了业务流程
     * @param sysUser 登录用户
     * @param queryVO 查询参数
     * @return 查询结果
     */
    Wrapper<Boolean> isExistMaterialProcess(UserLoginCacheDTO sysUser, MaterialProcessRelVO queryVO);


    /**
     * 根据会员id、角色id、物料分组id、物料id、物料流程类型获取 物料流程规则配置
     * @param memberId 会员id
     * @param roleId 角色id
     * @param materialGroupId 物料分组id
     * @param materialId 物料id
     * @param processType 流程类型 枚举值 来源 MaterialProcessTypeEnum
     *                    1 - 新增物料流程
     *                    2 - 变更/启用物料流程
     * @return 物料流程规则配置key
     */
    Wrapper<MaterialProcessDTO> getMaterialProcessByMemberIdAndRoleIdAndMaterialGroupIdAndMaterialIdAndProcessType(Long memberId, Long roleId, Long materialGroupId, Long materialId, Integer processType);
}
